<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=s, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 继承   
            // 原型继承
                // 通过使子类的原型对象等于父类的一个实例来实现继承。
                // 可以使用原型方法 ， 但是无法给父类传参
            // function Parent( name , sex ){
            //     this.name = name;
            //     this.sex = sex;
            // }

            // Parent.prototype.say = function(){
            //     console.log(`say hello`)
            // }

            // function Son( age ){
            //     this.age = age
            // }
            // Son.prototype = new Parent();
            // Son.prototype.constructor = Son;
            // Son.prototype.do = function(){
            //     console.log(`干家务`)
            // }
            // var son1 = new Son(18 , "张三")
            // console.log(son1)
            // console.log(son1.say)


            // 构造函数继承
            // 可以给父类传参 ， 但是无法使用原型方法
            // function Parent( name , sex ){
            //     this.name = name;
            //     this.sex = sex;
            // }

            // Parent.prototype.say = function(){
            //     console.log(`say hello`)
            // }

            // function Son( age , name , sex ){
            //     this.age = age
            //     Parent.call(this , name , sex)
            // }
            // Son.prototype.do = function(){
            //     console.log(`干家务`)
            // }

            // var son1 = new Son(18 , "张三" , "男")
            // console.log(son1)

            // 组合继承 
                // 原型【可以使用原型方法 ， 但是无法给父类传参】+ 构造函数【可以给父类传参 ， 但是无法使用原型方法】

            function Parent( name , sex ){
                this.name = name;
                this.sex = sex;
            }

            Parent.prototype.say = function(){
                console.log(`say hello`)
            }

            function Son( age , name , sex ){
                this.age = age
                // 执行父类时 修改指向为子类  -> 传参
                Parent.call(this , name , sex)
            }
            Son.prototype = new Parent();   //  访问原型  此时构造器需要修改  Son
            Son.prototype.constructor = Son
            Son.prototype.do = function(){
                console.log(`干家务`)
            }

            var son1 = new Son(20 , "lily" , "女")
            console.log(son1)
            console.log(son1.name)
            console.log( son1.age )
            son1.say()
            son1.do()
            console.log(son1.toString)

            // function C() {}
            // C.prototype.c=function(){console.log("c")}
            // function B() {}
            // B.prototype = new C()
            // B.prototype.b = function(){console.log("b")}
            // function A() {}
            // A.prototype = new B()
            // A.prototype.constructor = A
            // A.prototype.a = function(){console.log("a")}

            // const a = new A()
            // console.log(a)
            // console.log(a instanceof A) // true
            // console.log(a instanceof B) // true
            // console.log(a instanceof C) // true
    </script>
</body>
</html>